package com.itany.cloud.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.itany.cloud.util.ExceptionUtil;
import com.itany.cloud.util.ResponseResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * Author:shixiaojun@itany.com
 * Date: 2022/3/23 16:13
 * Version: 1.0-SNAPSHOT
 */
@RestController
@RequestMapping("/hello")
public class HelloController {

    @GetMapping("/f1")
    // value属性:指定资源名称,此处的资源名称即为当前请求地址
        // 但是value属性的值不能带有/
        // 例如:此处即为f1
    // blockHandler属性:处理BlockedException的方法名称
        // 其属性值为处理异常的方法的名字
        // 该方法由用户自定义,方法存在以下几个要求
        // 1.该方法必须在当前类中
        // 2.方法的返回值必须与当前请求的返回值一致
        // 3.该方法必须使用public进行修饰
        // 4.方法的参数必须是BlockException
    @SentinelResource(value = "f1",blockHandler = "handlerException")
    public ResponseResult f1(String id){
        return ResponseResult.success();
    }

    public ResponseResult handlerException(String id,BlockException e){
        return ResponseResult.fail("Sentinel异常,异常为:"+e);
    }


    @GetMapping
    // 全局异常处理
    // 通过blockHandlerClass属性指定当前处理全局异常的类是谁
    // 通过blockHandler属性指定对应类中的哪一个方法用于处理该方法的异常
    @SentinelResource(value = "",blockHandlerClass = ExceptionUtil.class,blockHandler = "handlerException")
    public ResponseResult f2(String id){
        return ResponseResult.success();
    }

}
